在上一篇文章中,我們已經學習了基本的Dockerfile用法。現在,讓我們更深入地瞭解一些常用的Dockerfile指令,以及它們的用途。
| 關鍵字 | 描述 | 
|---|---|
FROM <image_name>[:<image_tag>] | 
基礎映像。這指定了我們要使用的基礎映像檔,通常放在Dockerfile的頂部,用於設定開發環境。 | 
COPY <src> <dest> | 
複製文件或資料夾到容器內。規則需符合Go的filepath.Match。 | 
ADD | 
與COPY相似,但在複製tar壓縮文件時會自動解壓縮。推薦使用COPY除非有特殊需求。 | 
RUN <command> or RUN [“command”, “arg1”, “arg2”, …] | 
執行命令,用於在Dockerfile構建過程中執行操作。 | 
CMD | 
類似於RUN,但在容器運行時執行,如果有多行CMD,只執行最後一行。 | 
ENTRYPOINT | 
類似於CMD,但始終被執行。 | 
WORKDIR <dir_name> | 
設定工作目錄,建立的工作目錄會存在於每一層。如果不存在,則會自動建立。 | 
EXPOSE <port_number> | 
宣告開放的PORT,但需要使用端口映射來連接到主機。 | 
ENV <key>=<value> | 
設定環境變數,用於執行時所需的環境變數。 | 
ARG | 
類似於ENV,但僅在Dockerfile作用,用於Image建構過程中的環境變數。 | 
需要注意的是,Dockerfile的指令每執行一次都會在Docker上創建一個新的層(Layer),過多的無意義層會導致Image膨脹過大,最多到127層。
此外,Dockerfile撰寫規則要求必須包含至少1個CMD或ENTRYPOINT(但如果沒有好像也不會有什麼問題)。
現在,我們來更詳細地介紹這些指令的用途。
第一個FROM已經在上一篇文章中介紹過了,它用於指定接下來的開發環境的基礎映像。
COPY和ADD都用於將文件或文件夾複製到容器內。不過,如果複製的文件是tar壓縮文件時,ADD會自動解壓縮後再複製到容器內。根據官方文件,除非有特殊需求,推薦使用COPY。
RUN指令用於在Image建構的過程中執行特定操作,例如安裝套件或進行其他操作。
CMD和ENTRYPOINT都是在啟動容器時執行的指令,不同之處在於ENTRYPOINT始終會被執行,而CMD如果有多行,只會執行最後一行。當容器運行時,如果指定了其他指令,它們將覆蓋CMD和ENTRYPOINT。
WORKDIR指令用於設定接下來的工作目錄。新建的工作目錄會存在於每一層,如果目錄不存在,它將自動創建。
EXPOSE指令宣告容器內部開放的端口,但需要使用端口映射來連接到主機。
ENV和ARG用於設定環境變數。不同之處在於ARG主要在Image建構過程中使用,用於指定版本等,而ENV是在執行時所需的環境變數。